/**
 * @description 发布订阅中心
 * @returns 
 */
const createEventHub = () => ({
  hub: Object.create(null),
  // 发布
  emit(event, data) {
    (this.hub[event] || []).forEach(handler => handler(data));
  },
  // 订阅
  on(event, handler) {
    if (!this.hub[event]) this.hub[event] = [];
    this.hub[event].push(handler);
  },
  // 取消
  off(event, handler) {
    const i = (this.hub[event] || []).findIndex(h => h === handler);
    if (i > -1) this.hub[event].splice(i, 1);
    if (this.hub[event].length === 0) delete this.hub[event];
  }
})

// 例子
const handler = data => console.log(data);
const hub = createEventHub();
let increment = 0;

// 订阅：侦听不同类型的事件
hub.on('message', handler);
hub.on('message', () => console.log('Message event fired'));
hub.on('increment', () => console.log(++increment));

// 发布：发出事件以调用订阅它们的所有处理程序，将数据传递给它们作为参数
hub.emit('message', 'hello world'); // 打印 "hello world" 和 "Message event fired"
hub.emit('message', { hello: 'world' }); // 打印 "{ hello: 'world' }" 和 "Message event fired"
hub.emit('increment'); // 1

// 取消订阅：停止特定的处理程序侦听 message 事件
hub.off('message', handler);